package egovframework.rte.ptl.mvc.validation;

import org.apache.commons.validator.Field;
import org.apache.commons.validator.ValidatorAction;
import org.springframework.validation.Errors;
import org.springmodules.validation.commons.FieldChecks;

@SuppressWarnings("serial")
public class RteFieldChecks2 extends RteFieldChecks {
	 /**
     * 패스워드 점검 : 8~20자 이내
     * 
     * @param password
     * @return
     */
    protected static boolean checkLength(String password) {
	System.out.println("Length : " + password.length());
	
	if (password.length() < 8 || password.length() > 20) {
	    return false;
	}
	
	return true;
    }
    
    /**
     * 패스워드 점검 : 한글,특수문자,띄어쓰기는 안됨
     * 
     * @param password
     * @return
     */
    protected static boolean checkCharacterType(String password) {
	char[] charArray = password.toCharArray();
	
	for (int i = 0; i < charArray.length; i++) {
	    char ch = charArray[i];
	    /*
	    // javascript 부분에는 33~47로 되어 있으나 공백을 처리하기 위해 32~47로 변경함..
	    if ((ch >= 32 && ch <= 47) || (ch >= 58 && ch <= 64) || (ch >= 91 && ch <= 96) || (ch >= 123 && ch <= 126)) {
		return false;
	    }
	    */
	    if (ch < 33 || ch > 126) {	// 대부분의 문자를 사용하도록 변경 (javascript도 변경)
		return false;
	    }
	}
	
	return true;
    }
    
    /**
     *  패스워드 점검 : 연속된 문자나 순차적인 문자 4개이상 사용금지
     *  
     * @param password
     * @return
     */
    protected static boolean checkSeries(String password) {
	int countSequence = 0, countSame = 0;
	
        for (int i = 0; i < password.length() - 1; i++) {
            char pass = password.charAt(i);
            char next = (char)(pass + 1);
            if (password.charAt(i + 1) == next) {
        	countSequence++;
            } else {
        	countSequence = 0;
            }
            
            if (pass == password.charAt(i+1)) {
        	countSame++;
            } else {
        	countSame = 0;
            }
            
            if (countSequence > 2 || countSame > 2) {
        	return false;
            }
        }
        
        return true;
    }

    
    /**
     * 패스워드 점검 : 8~20자 이내
     * 
     * @param bean
     * @param va
     * @param field
     * @param errors
     * @return
     */
    public static boolean validatePassword1(Object bean, ValidatorAction va, Field field, Errors errors) {

	String password = FieldChecks.extractValue(bean, field);

	if (! checkLength(password)) {
	    FieldChecks.rejectValue(errors, field, va);
	    return false;
	}
	
	return true;
    }
    
    /**
     * 패스워드 점검 : 한글,특수문자,띄어쓰기는 안됨
     * 
     * @param bean
     * @param va
     * @param field
     * @param errors
     * @return
     */
    public static boolean validatePassword2(Object bean, ValidatorAction va, Field field, Errors errors) {
	String password = FieldChecks.extractValue(bean, field);

	if (! checkCharacterType(password)) {
	    FieldChecks.rejectValue(errors, field, va);
	    return false;
	}

	return true;
    }
    
    /**
     * 패스워드 점검 : 연속된 문자나 순차적인 문자 4개이상 사용금지
     * 
     * @param bean
     * @param va
     * @param field
     * @param errors
     * @return
     */
    public static boolean validatePassword3(Object bean, ValidatorAction va, Field field, Errors errors) {
	String password = FieldChecks.extractValue(bean, field);

	if (! checkSeries(password)) {
	    FieldChecks.rejectValue(errors, field, va);
	    return false;
	}

	return true;
    }
    
    /**
     * 패스워드 점검 : 반복문자나 숫자 연속 4개이상 사용금지
     * 
     * @param bean
     * @param va
     * @param field
     * @param errors
     * @return
     */
    public static boolean validatePassword4(Object bean, ValidatorAction va, Field field, Errors errors) {
	String password = FieldChecks.extractValue(bean, field);

	if (! checkSeries(password)) {
	    FieldChecks.rejectValue(errors, field, va);
	    return false;
	}

	return true;
    }
    
}
